/*
 * impressor.c
 *
 *  Created on: 28/05/2011
 *      Author: fernando
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "impressor.h"

/*codigo escreve a arvore AVL em um arquivo dot graphviz*/
/*permite a visualizacao da arvore em um arquivo de imagem*/

void imprimeArvore(No *raiz, char *nome) {
	int i = 0;
	FILE *arq;
	while(nome[i] != '.' && nome[i] != '\0') i++;
	nome[i] = '\0';
	i = 0;
	strcat(nome, ".dot");
	arq = fopen(nome, "w");
	while(nome[i] != '.' && nome[i] != '\0') i++;
	nome[i] = '\0';
	i = 0;
	fprintf(arq, "digraph %s {\n\tnode [shape = record]\n", nome);
	imprimeSubArvore(raiz, arq, &i);
	fprintf(arq, "}");
	fclose(arq);
}

void imprimeSubArvore(No *raiz, FILE *arq, int *i) {
	int k = *i;
	if (raiz == NULL)
		return;
	fprintf(arq, "\tq%d [label = \"<f0> |<f1> %s|<f2> \"]\n", *i, raiz->word);
	if (raiz->esq != NULL) {
		fprintf(arq, "\tq%d:f0 -> q%d:f1\n", k, ++*i);
		imprimeSubArvore(raiz->esq, arq, i);
	}
	if (raiz->dir != NULL) {
		fprintf(arq, "\tq%d:f2 -> q%d:f1\n", k, ++*i);
		imprimeSubArvore(raiz->dir, arq, i);
	}

}

void imprimePalavras(No *raiz, char *texto) {
	NoTexto *pTex;
	NoLinha *pLin;
	char index[MAXPALAVRA];
	FILE *arq;

	if(raiz == NULL)
		return;

	imprimePalavras(raiz->esq, texto);

	for(pTex = raiz->textos; pTex != NULL; pTex = pTex->prox) {
		if(strcmp(pTex->tex->nome, texto) == 0) {
			// substitui a extensao *.txt por *.idx e abre o arquivo de indice
			strcpy(index, texto);
			strcpy(index+strlen(index)-3, "idx");
			arq = fopen(index, "a");
			if(arq == NULL) {
				perror("Falha na abertura do arquivo.");
				return;
			}

			fprintf(arq, "%s: ", raiz->word);
			for(pLin = pTex->linhas; pLin != NULL; pLin = pLin->prox) {
				fprintf(arq, "%d ", pLin->l->num);
			}
			fprintf(arq, "\n");
			fclose(arq);
		}
	}

	imprimePalavras(raiz->dir, texto);
}

void imprimeLinhasPalavra(char word[MAXPALAVRA], No *raiz) {
	No *p;
	NoTexto *pTex;
	NoLinha *pLin;

	p = busca(word, raiz);
	if(p == NULL) {
		printf("Palavra nao indexada.\n");
		return;
	}
	pTex = p->textos;
	while(pTex != NULL) {
		printf("%s:\n", pTex->tex->nome);
		pLin = pTex->linhas;
		while(pLin != NULL) {
			printf("%d: %s", pLin->l->num, pLin->l->cont);
			pLin = pLin->prox;
		}
		pTex = pTex->prox;
	}
}

void imprimeListaLinhas(NoLinha *linhas) {
	NoLinha *p;
	p = linhas;

	while(p != NULL){
		printf("%d: %s", p->l->num, p->l->cont);
		p = p->prox;
	}
}

void imprimeListaTextos(NoTexto *textos) {
	NoTexto *p;
	p = textos;

	while(p != NULL) {
		printf("%s\n", p->tex->nome);
		imprimeListaLinhas(p->linhas);
		p = p->prox;
	}
}
